class AppController < ApplicationController

  before_filter :authorize_user, :except => ['login', 'register']
  before_filter :authorize_admin, :only => :register

  def initialize

    @Days = {
      1 => "Mon",
      2 => "Tue",
      3 => "Wed",
      4 => "Thu",
      5 => "Fri"
    }
    
    @Day_n = {
      "Mon" => "1",
      "Tue" => "2",
      "Wed" => "3",
      "Thu" => "4",
      "Fri" => "5"
    }

    @Dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes"]
  end

  # guardamos:
  # username, user_id, type, humanname
  # en session para reusarlos
  def login
    if session[:username] # el usuario quiere abrir sesión cuando ya tiene
      flash[:notice] = "Cierra primero tu sesión antes de abrir otra"
      return
    end
    if request.post? # el usuario manda sus datos
      session[:username] = nil
      session[:type] = nil
      session[:user_id] = nil
      session[:humanname] = nil
      session[:has_image] = nil
      if Alumno.find_by_username(params[:record][:username])
        user = Alumno.authenticate(params[:record][:username], params[:record][:clave])
        user_type = 'alumno'
      elsif Profesor.find_by_username(params[:record][:username])
        user = Profesor.authenticate(params[:record][:username], params[:record][:clave])
        user_type = 'profesor'
      else # el nombre de usuario no existe
        flash[:notice] = "El usuario \"#{params[:record][:username]}\" no existe"
        return
      end
      if user
        session[:username] = user.username
        session[:user_id] = user.id
        session[:has_image] = user.imagen ? true : false
        # es un administrador
        if user.username == 'admin'
          session[:type] = 'admin'
          session[:humanname] = 'Administrador'
          redirect_to(:action => "register")
          # es un profesor o alumno
        else
          session[:type] = user_type
          session[:humanname] = user.human_name
          redirect_to(:action => "list_citas")
        end
      else
        flash[:notice] = "La clave es incorrecta para el usuario \"#{params[:record][:username]}\""
      end
    end
  end

  def logout
    session[:username] = nil
    session[:type] = nil
  end

  ### Registro

  def register

  end

  def create_user
    if $user_type == 'alumno'
      @record = Alumno.new(params[:record])
    elsif $user_type == 'profesor'
      @record = Profesor.new(params[:record])
    end
    if @record.save
      flash.now[:notice] = "El usuario fue creado"
      if $user_type == 'profesor'
        horario = Horario.new 
        horario.profesor_id = @record.id
        horario.horas = "Mon 1200-1300;"
        horario.save
        render :update do |page|
          page.redirect_to :controller => 'profesores', :action => 'list'
        end
      else
        render :update do |page|
          page.redirect_to :controller => 'alumnos', :action => 'list'
        end         
      end
        
    else
      render :update do |page|
        page["reporte_error"].replace_html :partial => "errores"
        page["escondido"].visual_effect :blind_down, :duration => 3
      end
    end
     #redirect_to :action => 'register'
  end

  def show_form
    @form = params[:user_type]
    $user_type = @form
    #redirect_to :action => 'register'
  end

	def cambio_estado
		dom = params[:id]+":cambio"
		render :update do |page|
			page[dom].replace_html :partial => "cambio_estado", :locals => {:cita => params[:id]}
		end
	end
	
	def update_estado
		c = Cita.find(params[:id])
		c.estado = params[:cita][:estado]
		c.update
		render :update do |page|
			page[params[:id]+":cambio"].replace_html :partial => "estado_cita", :locals => {:record => c}
		end
	end

	## Realiza la búsqueda
  def realizar_busqueda
    	d = params[:date]
      t = Time.parse("#{d[:year]}/#{d[:month]}/#{d[:day]} #{d[:hour]}:#{d[:minute]}" )
      session[:fecha ] = t
      prof = Profesor.find(:all)
      @profesores = Array.new
      for p in prof
      	if TimeWindow.new(p.horario.horas).include? t	or p.area.eql? params[:area]
      		@profesores << p
      	end
      end
    render :update do |page|
      page['resultados'].replace_html :partial => 'profesor_busqueda',
      :object => @profesores
    end
  end

  ### Mis Citas

  def list_citas
    if session[:type] == 'profesor'
      @opposite_user = 'alumno'
      type_id = 'profesor_id'
    else
      @opposite_user = 'profesor'
      type_id = 'alumno_id'
    end
    @pages, @collection = paginate :citas,
      :conditions => ["#{type_id} = ?", session[:user_id]],
      :per_page => 10
  end

  def new_cita
  end
  
  def create_cita
    c = Cita.new(:profesor_id => params[:id],
              	 :alumno_id => session[:user_id],
                 :fecha => session[:fecha],
                 :estado => "Pendiente")
    if c.save!
      render :update do |page|
      	page.insert_html :bottom, "listador_citas", :partial => 'cita_listada', :locals => {:record => c}
      	page.visual_effect :highlight, "#{c.id}", :duration => 5
      end
    end
  end

  def show_cita
    @record = Cita.find(params[:id])
  end

  def cancel_cita
    cita = Cita.find(params[:id])
    cita.estado= "Cancelada"
    cita.update
    flash[:notice] = "La cita fue cancelada"
    redirect_to :action => 'list_citas'
  end


  ### Editar Perfil

  def show_perfil
    if session[:type] == 'alumno'
      @partial = 'alumno_perfil'
      @record = Alumno.find session[:user_id]
    elsif session[:type] == 'profesor'
      @partial = 'profesor_perfil'
      @record = Profesor.find session[:user_id]
    end

  end

  def update_perfil
    if session[:type] == 'alumno'
      alumno = Alumno.find(params[:id])
      if alumno.update_attributes(params[:record])
        if alumno.imagen
          session[:has_image] = alumno.imagen ? true : false
        end
        flash[:notice] = "Tu perfil fue modificado"
        session[:username] = alumno.username
        session[:humanname] = alumno.human_name
      end
    elsif session[:type] == 'profesor'
      profesor = Profesor.find(params[:id])
      if profesor.update_attributes(params[:record]) 
        if profesor.imagen
          session[:has_image] = profesor.imagen ? true : false
        end       
        flash[:notice] = "Tu perfil fue modificado"
        session[:username] = profesor.username
        session[:humanname] = profesor.human_name
      end
    end
    redirect_to :action => 'show_perfil'
  end


  ### Mi Horario

  def show_horario
    horario = Horario.find_by_profesor_id(session[:user_id]).horas
    tw = TimeWindow.new(horario)
    @time_window = tw.rules
  end

  def new_regla
    @date_from = Time.now
    @date_to = Time.now    
  end

  def add_regla
    horario = Horario.find_by_profesor_id(session[:user_id])
    new_rule = ""
    @Dias.each do |dia|
      day = @Days[params[:checkbox][dia].to_i]
      new_rule += if day then day + " " else "" end
    end

    new_rule += "#{params[:date][:from_hour]}#{params[:date][:from_minutes]}-"
    new_rule += "#{params[:date][:to_hour]}#{params[:date][:to_minutes]}"
    horario.horas= horario.horas + " " + new_rule + ";"
    horario.update
    redirect_to :action => 'show_horario'
  end

  def edit_regla
    @checkbox = Hash.new
    rule = params[:rule]["rule"]
    tw = TimeWindow.new rule
    tw.rules[0][:days].split(" ").each do |day|
      @checkbox[day] = true
    end
    from = Hash.new
    to = Hash.new    
    from[:hour] =  tw.ranges[0][0].to_s.slice(1..2).to_i
    to[:hour] = tw.ranges[0][1].to_s.slice(1..2).to_i
    from[:min] =  tw.ranges[0][0].to_s.slice(3..4).to_i
    to[:min] = tw.ranges[0][1].to_s.slice(3..4).to_i
    @date_from =  Time.local(2000,"jan",1,from[:hour],from[:min],1)
    @date_to = Time.local(2000,"jan",1,to[:hour],to[:min],1)
    @rule = rule
  end

  def update_regla
    horario = Horario.find_by_profesor_id(session[:user_id])
    new_rule = ""
    @Dias.each do |dia|
      day = @Days[params[:checkbox][dia].to_i]
      new_rule += if day then day + " " else "" end
    end

    new_rule += "#{params[:date][:from_hour]}#{params[:date][:from_minutes]}-"
    new_rule += "#{params[:date][:to_hour]}#{params[:date][:to_minutes]}"
    #horario.horas= horario.horas + " " + new_rule + ";"
    horario.horas= horario.horas.sub(params[:rule], new_rule)
    horario.update    
    redirect_to :action => 'show_horario'
  end


  def delete_regla
    rule = params[:rule]
    horario = Horario.find_by_profesor_id(session[:user_id])
    horario.horas= horario.horas.sub(rule[:rule]+";", "")
    horario.update
    redirect_to :action => 'show_horario'
  end

end
